
#ifndef _C_LIST_H_
#define _C_LIST_H_

#include <cTools/Common.h>

typedef struct _C_List_Node
{
	struct _C_List_Node* 	Next;
	struct _C_List_Node*	Prev;
	void*					Data;
} C_List_Node;

typedef C_List_Node* C_List_Node_Ptr;

C_List_Node_Ptr
C_List_Node_New(void);

void
C_List_Node_Free(C_List_Node_Ptr);

typedef struct _C_List
{
	C_List_Node_Ptr		Head;
	C_List_Node_Ptr		Tail;
	C_Mem_Free_t		Free;
	size_t				Size;
} C_List;

typedef C_List* C_List_Ptr;

C_List_Ptr
C_List_New(void);

void
C_List_Free(C_List_Ptr);

C_Error_t
C_List_Set_Mem_Free(C_List_Ptr, C_Mem_Free_t);

C_Error_t
C_List_Insert(C_List_Ptr, void*, C_List_Node_Ptr);

C_Error_t
C_List_Get_Head(C_List_Ptr, C_List_Node_Ptr*);

C_Error_t
C_List_Get_Tail(C_List_Ptr, C_List_Node_Ptr*);

C_Error_t
C_List_Remove(C_List_Ptr, C_List_Node_Ptr, void**);

C_Error_t
C_List_Destroy(C_List_Ptr, C_List_Node_Ptr);

C_Error_t
C_List_Clear(C_List_Ptr);

#define C_List_Head(list) \
	((list)->Head)

#define C_List_Tail(list) \
	((list)->Tail)

#define C_List_For_Each(list, node) \
	for(node = list->Head; node != NULL; node = node->Next)

#endif
